﻿using SecurityLDAP;
using Services.OtherServices;
using GeneralServices.ViewModel;
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;

namespace ScreenConnection
{
    /// <summary>
    /// ViewModel de l'écran de connection.
    /// S'occupe juste de gérer les actions sur la vue grace aux deux commands Valider et Annuler.
    /// </summary>
    public class EcranConnectionViewModel
    {
        #region Attribut(s)

        #endregion

        #region Propriété(s)

        #region Commandes

        /// <summary>
        /// Commande Valider la connexion
        /// </summary>
        public ICommand Valider
        {
            get;
            private set;
        }

        /// <summary>
        /// Commande Annuler la connexion
        /// </summary>
        public ICommand Annuler
        {
            get;
            private set;
        }

        /// <summary>
        /// Commande lors de l'appui sur Entrer dans la fenetre de connexion
        /// </summary>
        public ICommand RunAuth
        {
            get;
            private set;
        }

        #endregion

        #endregion

        #region Constructeur(s)

        /// <summary>
        /// Constructeur sans paramètres qui initialise les command
        /// </summary>
        public EcranConnectionViewModel()
        {
            /** INIT COMMAND **/
            Valider = new RelayCommand(ValiderConnexion);
            Annuler = new RelayCommand(AnnulerConnexion);
            RunAuth = new RelayCommand(ValiderConnexion);
        }

        #endregion

        #region Méthode(s)

        /// <summary>
        /// Methode appelé lorsque la command Valider est appelé
        /// </summary>
        /// <param name="vue">Vue de l'action émettrice, en quelque sorte l'écran de connexion</param>
        public void ValiderConnexion(object vue)
        {
            if (vue != null && vue is EcranConnection)
            {
                EcranConnection view = ((EcranConnection)vue);
                // si aucun controleur a été inscrit pour la déléguation de la connexion
                if (view.Automatic)
                {
                    /** Si l'utilisateur souhaite que ce soit le socle qui implémente le controle d'autorisation **/
                    Dictionary<string, string> values = view.BuildDico();
                    // Appel au webservice utilisateur
                    try
                    {
                        LDAPAuthentication ldap =
                            new LDAPAuthentication(
                                EcranConnection.LDAPServer,
                                EcranConnection.LDAPDomain,
                                values["Utilisateur"], values["Mot de passe"]);

                        GENERAL_USER user = Services.ServiceUser.GetUser(values["Utilisateur"], values["Mot de passe"], @"name=EntitiesRenovationSPP");
                        view.Auth = (String.IsNullOrEmpty(ldap.IsAuthenticated()) && user != null);
                        view.UserConnecte = user;
                    }
                    catch (Exception)
                    {
                        view.Auth = false;
                    }
                }
                else
                {
                    // Lancer la méthode Authentificate de l'observateur
                    view.Auth = view.ConnectionView.Authentificate(view.BuildDico());
                }

                // On ferme la fenetre, ce qui permet au à l'événement EcranConnection_Closing() d'être appelé
                // A ce moment, la si Auth = true, on peut appeler la GenericApplication sinon on affiche un message d'erreur et 
                // on arrete la fermeture de l'écran de connection
                CloseWindow(view);
            }
        }

        /// <summary>
        /// Methode appelé lorsque la command Annuler est appelé
        /// </summary>
        /// <param name="vue">Vue de l'action émettrice, en quelque sorte l'écran de connexion</param>
        public void AnnulerConnexion(object vue)
        {
            if (vue != null && vue is EcranConnection) 
            {
                ((EcranConnection)vue).Annuler = true;
                CloseWindow(vue);
            }
        }

        /// <summary>
        /// Méthode permettant de fermer la fenêtre
        /// </summary>
        /// <param name="vue"></param>
        public void CloseWindow(object vue)
        {
            ((Window)vue).Close();
        }

        #endregion
    }
}
